//
// Created by Jisam on 2024/7/7.
//
#include <bits/stdc++.h>
#define PSI pair<string,int>
#define PII pair<int,int>
#define x first
#define y second
// 使用命名空间std，方便访问标准库中的函数和对象
using namespace std;

// 定义常量N，表示最大值为10^5+5
const int N = 1e5 + 5;

// 定义全局变量ans，用于存储从A到B的最小步数，初始值设为INT_MAX表示未找到路径
int ans = INT_MAX;

// 定义函数solve，用于解决从位置A到位置B的最小步数问题
void solve() {
    // 输入N，A，B，分别表示数组长度和起始、目标位置
    int N, A, B;
    cin >> N >> A >> B;

    // 初始化数组K和vis，K用于存储每个位置的移动范围，vis用于标记位置是否已被访问
    vector<int> K(N + 2, 0), vis(N + 2, 0);

    // 输入数组K的值
    for (int i = 1; i <= N; i++) {
        cin >> K[i];
    }

    // 使用队列q来进行广度优先搜索
    queue<PII> q;
    q.push({A, 0}); // 将起始位置A入队，并标记为已访问
    vis[A] = 1;

    // 当队列不为空时，进行循环
    while (q.size()) {
        // 出队并获取当前位置和步数
        int tx = q.front().x;
        int ty = q.front().y;
        q.pop();

        // 如果当前位置等于目标位置B，则更新ans为当前步数，并结束搜索
        if (tx == B) {
            ans = ty;
            break;
        }

        // 如果当前位置加上K的值在有效范围内且未被访问，则将新位置入队，并标记为已访问
        if (tx + K[tx] > 0 && tx + K[tx] <= N && !vis[tx + K[tx]]) {
            q.push({tx + K[tx], ty + 1});
            vis[tx + K[tx]] = 1;
        }

        // 如果当前位置减去K的值在有效范围内且未被访问，则将新位置入队，并标记为已访问
        if (tx - K[tx] > 0 && tx - K[tx] <= N && !vis[tx - K[tx]]) {
            q.push({tx - K[tx], ty + 1});
            vis[tx - K[tx]] = 1;
        }
    }
    // 根据ans的值输出结果，如果ans等于INT_MAX，则输出-1表示无解
    if (ans == INT_MAX) {
        cout << -1;
    } else {
        cout << ans;
    }
}

// 主函数
int main() {
    // 关闭同步标准输入输出流与C风格输入输出流，提高输入输出效率
    ios::sync_with_stdio(false);
    // 解除cin与cout的关联，提高输入输出效率
    cin.tie(nullptr);
    // 调用solve函数解决问题
    solve();
    // 程序正常退出
    return 0;
}
